{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# Python 语言基础\n",
    "\n",
    "## 基本语法\n",
    "\n",
    "**例题1：计算万有引力**\n",
    "\n",
    "假设两个人，一个人的质量是 $70kg$​​ ，另外一个人的质量是 $50kg$​​ ，当两人相距 $0.5m$​​ 的时候，他们之间的引力大小是多少？（ $G=6.67\\times10^{-11}m^3kg^{-1}s^{-2}$）\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "两个人之间的引力大小是：9.296e-07N\n"
     ]
    }
   ],
   "source": [
    "G = 6.64e-11    # 科学计数法, 此处的变量用大写，常用于表示全局变量\n",
    "force = G * 70 * 50 / (0.5 ** 2)   # 变量的命名，要有意义\n",
    "print(f\"两个人之间的引力大小是：{force}N\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "两个人之间的引力大小是：9.296e-07N\n"
     ]
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "G = 6.64e-11\r\n",
    "force = G * 70 * 50 / (0.5 ** 2)\r\n",
    "print(\"两个人之间的引力大小是：{}N\".format(force))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "**例题2：相等和同一**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = 256\n",
    "b = 256\n",
    "id(a) == id(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = 257\n",
    "d = 257\n",
    "id(c) == id(d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c == d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "a = 257\r\n",
    "b = 257\r\n",
    "a is b #比较的是id\r\n",
    "a == b #比较的是数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c is d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "**例题3：理解序列中的索引和切片**\n",
    "\n",
    "1. 索引\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/f771bd61df8c4c219ab60ac14c2e7eee2ca73a1c5f7041b5b982d42628c9b5d6)\n",
    "\n",
    "2. 切片\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/dec884fd260543fa98cc077c88815057de007ef81927498aa834bf7cc4aea587)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'p'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book = 'python book'\n",
    "book[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "c\n",
      "----------\n",
      "s oe\n",
      "----------\n",
      "love\n"
     ]
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "book =\"csb loves python\"\r\n",
    "print(book[0])\r\n",
    "print(\"-\"*10)\r\n",
    "print(book[1:8:2])\r\n",
    "print(\"-\"*10)\r\n",
    "print(book[-12:8:1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ython b\n",
      "ython b\n"
     ]
    }
   ],
   "source": [
    "print(book[1: 8])\n",
    "print(book[1: 8: 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ython b'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[-10: 8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ython b'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[1: -3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ython b'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[-10: -3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'yhnb'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[1: 8: 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'yhnb'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[1: -3: 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'yhnb'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[-10: 8: 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'yhnb'"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "book[-10: -3: 2]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "步长为正：\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/0d580a3729ab4ac3b32554e1549a3a06f1c223b0c24e4d0ba95170977e34f536)\n",
    "\n",
    "步长为负：\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/765af81cce0c4c8eba9effc2baf694df7cb0f250461246d9880e61f9ec31a693)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "**例题4：对象的方法**\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/a05f8477b617470da95d53620a0fbe82507a710f522741fab6bbff24d7e30e35)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['__class__',\n",
       " '__contains__',\n",
       " '__delattr__',\n",
       " '__delitem__',\n",
       " '__dir__',\n",
       " '__doc__',\n",
       " '__eq__',\n",
       " '__format__',\n",
       " '__ge__',\n",
       " '__getattribute__',\n",
       " '__getitem__',\n",
       " '__gt__',\n",
       " '__hash__',\n",
       " '__init__',\n",
       " '__init_subclass__',\n",
       " '__iter__',\n",
       " '__le__',\n",
       " '__len__',\n",
       " '__lt__',\n",
       " '__ne__',\n",
       " '__new__',\n",
       " '__reduce__',\n",
       " '__reduce_ex__',\n",
       " '__repr__',\n",
       " '__setattr__',\n",
       " '__setitem__',\n",
       " '__sizeof__',\n",
       " '__str__',\n",
       " '__subclasshook__',\n",
       " 'clear',\n",
       " 'copy',\n",
       " 'fromkeys',\n",
       " 'get',\n",
       " 'items',\n",
       " 'keys',\n",
       " 'pop',\n",
       " 'popitem',\n",
       " 'setdefault',\n",
       " 'update',\n",
       " 'values']"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "dir(dict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['__add__',\n",
       " '__class__',\n",
       " '__contains__',\n",
       " '__delattr__',\n",
       " '__delitem__',\n",
       " '__dir__',\n",
       " '__doc__',\n",
       " '__eq__',\n",
       " '__format__',\n",
       " '__ge__',\n",
       " '__getattribute__',\n",
       " '__getitem__',\n",
       " '__gt__',\n",
       " '__hash__',\n",
       " '__iadd__',\n",
       " '__imul__',\n",
       " '__init__',\n",
       " '__init_subclass__',\n",
       " '__iter__',\n",
       " '__le__',\n",
       " '__len__',\n",
       " '__lt__',\n",
       " '__mul__',\n",
       " '__ne__',\n",
       " '__new__',\n",
       " '__reduce__',\n",
       " '__reduce_ex__',\n",
       " '__repr__',\n",
       " '__reversed__',\n",
       " '__rmul__',\n",
       " '__setattr__',\n",
       " '__setitem__',\n",
       " '__sizeof__',\n",
       " '__str__',\n",
       " '__subclasshook__',\n",
       " 'append',\n",
       " 'clear',\n",
       " 'copy',\n",
       " 'count',\n",
       " 'extend',\n",
       " 'index',\n",
       " 'insert',\n",
       " 'pop',\n",
       " 'remove',\n",
       " 'reverse',\n",
       " 'sort']"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dir(list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "lst = [2,5,1,3]    # 列表是个筐，什么都能装\n",
    "lst.sort()         # 没有返回对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None\n",
      "----------\n",
      "[2, 3, 4, 6]\n",
      "----------\n",
      "[2, 3, 4, 6]\n"
     ]
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "lst = [2,3,4,6]\r\n",
    "print(lst.sort())\r\n",
    "print(\"-\"*10)\r\n",
    "print(lst)\r\n",
    "print(\"-\"*10)\r\n",
    "print(sorted(lst))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 5]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lst    # 原地修改，lst 对象的 id 没有变"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "**例题5：容器中的映射关系**\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/9a9bf2ef5d3d4f7db945980b224505a4644101d1a7214de0bae884554e3b33ee)\n",
    "\n",
    "- “键”必须唯一，不能重复——参考本书目录理解，目录名称不能重复。\n",
    "- “键”必须是不可变对象——如果书的目录名称会变化，那就不仅仅是眼花缭乱，而是手忙脚乱了。\n",
    "- “值”可以是 Python 中任何类型对象。\n",
    "- “值”可以重复。“键”已经作为“键值对”的唯一标识了，对“值”就不做唯一性要求。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'name': 'laoqi', 'city': ['shanghai', 'soochow', 'hangzhou']}"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = {\"name\": \"laoqi\", \"city\": ['shanghai', 'soochow', 'hangzhou']}\n",
    "d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "csb wants to forget the bb\n"
     ]
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "similar = {\"csb\":\"bb\", \"fzm\":\"qq\"}\r\n",
    "similar\r\n",
    "print(\"csb wants to forget the {}\".format(similar.get(\"csb\")))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 斐波那契数列\n",
    "\n",
    "相关的文件，可以在 work z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "用递归算法实现斐波那契数列\n",
    "'''\n",
    "\n",
    "def fib_recursive(n):    \n",
    "    '''\n",
    "    n: int 表示项数\n",
    "    '''\n",
    "    if n == 0: return 0\n",
    "    if n == 1: return 1\n",
    "    else:\n",
    "        return fib_recursive(n-1) + fib_recursive(n-2)\n",
    "fib_recursive(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n"
     ]
    }
   ],
   "source": [
    "#my_print_codes\r\n",
    "def febnacci(n):\r\n",
    "    if n == 0: return 0\r\n",
    "    if n == 1: return 1\r\n",
    "    return febnacci(n-1) + febnacci(n-2)\r\n",
    "print(febnacci(3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "'''\n",
    "用 for 循环实现斐波那契数列\n",
    "'''\n",
    "\n",
    "def fib_for(n:int):    # `:int` 说明了 n 的类型，但不强制\n",
    "    '''\n",
    "    n: int 表示项数\n",
    "    '''\n",
    "    result = [0, 1]\n",
    "    for i in range(n-2):\n",
    "        result.append(result[-2] + result[-1])\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "'''\n",
    "用 while 循环实现斐波那契数列\n",
    "'''\n",
    "\n",
    "def fib_while(n:int)->int:\n",
    "    '''\n",
    "    n: 整数，表示项数\n",
    "    :int 标注 n 的类型\n",
    "    ->int 标注函数返回值类型\n",
    "    '''\n",
    "    a, b = 0, 1\n",
    "    if n == 0: return 0\n",
    "    if n == 1: return 1\n",
    "    count = 0\n",
    "    while count < n-1:\n",
    "        a, b = b, a+b\n",
    "        count += 1\n",
    "    return b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "'''\n",
    "用迭代器对象实现斐波那契数列\n",
    "'''\n",
    "class Fibonacci:\n",
    "    '''\n",
    "    Fibonacci sequence iterator\n",
    "    fibs = Fibonacci(100), 100'th item fibonacci number\n",
    "    '''\n",
    "    def __init__(self, max):\n",
    "        self.max = max\n",
    "        self.a = 0\n",
    "        self.b = 1\n",
    "    def __iter__(self):\n",
    "        return self\n",
    "    def __next__(self):\n",
    "        fib = self.a\n",
    "        if fib > self.max:\n",
    "            raise StopIteration\n",
    "        self.a, self.b = self.b, self.a + self.b\n",
    "        return fib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "'''\n",
    "用生成器对象实现无限项的斐波那契数列\n",
    "'''\n",
    "def fib_generator():\n",
    "    prev, curr = 0, 1\n",
    "    while 1:    # While True\n",
    "        yield prev\n",
    "        prev, curr = curr, prev + curr\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#coding:utf-8\n",
    "'''\n",
    "用矩阵计算斐波那契数列\n",
    "'''\n",
    "import numpy as np\n",
    "\n",
    "def fib_matrix(n):\n",
    "    ma = np.mat([[1, 1], [1, 0]])\n",
    "    fib = (ma ** n)[0, 0]\n",
    "    return fib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'lauda'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_101/255163687.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0m使用第三方模块\u001b[0m\u001b[0;31m：\u001b[0m\u001b[0mhttps\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m//\u001b[0m\u001b[0mgithub\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcom\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mastagi\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mlauda\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m '''\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mlauda\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mStopWatch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mfib_recursive\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfib_recursive\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mfib_for\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'lauda'"
     ]
    }
   ],
   "source": [
    "'''\n",
    "测试各个斐波那契数列实现方法的执行时间\n",
    "使用第三方模块：https://github.com/astagi/lauda\n",
    "'''\n",
    "from lauda import StopWatch\n",
    "from fib_recursive import fib_recursive\n",
    "import fib_for\n",
    "import fib_while, fib_iterator, fib_generator, fib_matrix\n",
    "import itertools\n",
    "\n",
    "dct = dict(\n",
    "    recursive = \"[fib_recursive(i) for i in range(20)]\",\n",
    "    forloop = \"fib_for.fib_for(20)\",\n",
    "    whileloop = \"[fib_while.fib_while(i) for i in range(20)]\",\n",
    "    iterator = \"[fib_iterator.Fibonacci(100000).__next__() for _ in range(20)]\",\n",
    "    generator = \"itertools.islice(fib_generator.fib_generator(), 20)\",\n",
    "    matrix = \"[fib_matrix.fib_matrix(i) for i in range(20)]\",\n",
    ")\n",
    "\n",
    "watch = StopWatch()\n",
    "watch.start()\n",
    "time_dct = {}\n",
    "for name, expression in dct.items():\n",
    "    eval(expression)\n",
    "    check_time = watch.checkpoint()\n",
    "    time_dct[name] = check_time\n",
    "\n",
    "for name, time in time_dct.items():\n",
    "    print(f\"Time of {name}: \\t {time}sec \\t {round(time/time_dct['recursive'], 4)}\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
